package com.trt.beibei.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.trt.beibei.exception.http.ServerErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.List;

/**
 * 通用泛型类与强类型转换json序列化和反序列化工具类
 */
@Component
public class GenericAndJson {

    //  @Autowired  // 静态方式实现依赖注入
    private static ObjectMapper mapper;

    @Autowired
    public void setMapper(ObjectMapper mapper) {
        GenericAndJson.mapper = mapper;
    }

    /**
     * 序列化方法
     */
    public static <T> String objectToJson(T o) {
        try {
            return GenericAndJson.mapper.writeValueAsString(o);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }

    /**
     * 反序列化方法
     */
//    public static <T> T jsonToObject(String s,  Class<T> tClass) { // 只能处理单体 object
//        if (s == null) {
//            return null;
//        }
//        try {
//            T o = GenericAndJson.mapper.readValue(s, tClass);
//            return o;
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//            throw new ServerErrorException(9999);
//        }
//    }
    public static <T> T jsonToObject(String s,  TypeReference<T> tr) { // 可以处理数组对象object
        if (s == null) {
            return null;
        }
        try {
            T o = GenericAndJson.mapper.readValue(s, tr);
            return o;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            throw new ServerErrorException(9999);
        }
    }




    /**
     * 处理集合
     * 2个思路：
     * 1.List<T>  整体当做泛型
     * 2.List<S>  只把S当做泛型
     */

    // 2.List<S>  只把S当做泛型，返回的不是spec是LinkedHashMap
//    public static <T> List<T> jsonToList(String s ) {
//        if (s == null) {
//            return null;
//        }
//        try {
////            T.class
//            List<T> list = GenericAndJson.mapper.readValue(s, new TypeReference<List<T>>() {});
//            return list;
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//            throw new ServerErrorException(9999);
//        }
//    }

      // 1.List<T>  整体当做泛型
//    public static <T> T jsonToList(String s, TypeReference<T> tr) { // 处理list的json序列化
//        if (s == null) {
//            return null;
//        }
//        try {
//            T list = GenericAndJson.mapper.readValue(s, tr);
//            return list;
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//            throw new ServerErrorException(9999);
//        }
//    }
}

